// 数据校验工具函数

// 校验结果接口
export interface ValidationResult {
  isValid: boolean;
  message?: string;
}

// 字符型校验（非空+最大长度）
export function validateString(value: string, maxLength: number = 100): ValidationResult {
  if (!value || value.trim() === '') {
    return { isValid: false, message: '不能为空' };
  }
  if (value.length > maxLength) {
    return { isValid: false, message: `超出最大长度${maxLength}个字符` };
  }
  return { isValid: true };
}

// 日期型校验（年月日格式：YYYY-MM-DD）
export function validateDate(value: string): ValidationResult {
  // 先用正则判断基本格式
  const dateRegex = /^(\d{4})-(\d{2})-(\d{2})$/;
  const match = value.match(dateRegex);
  if (!match) {
    return { isValid: false, message: '日期格式不正确，应为YYYY-MM-DD' };
  }
  const year = Number(match[1]);
  const month = Number(match[2]);
  const day = Number(match[3]);

  if (year < 1900 || year > 2100) {
    return { isValid: false, message: '年份必须在1900~2100之间' };
  }
  if (month < 1 || month > 12) {
    return { isValid: false, message: '月份不正确，应为01~12' };
  }
  if (day < 1 || day > 31) {
    return { isValid: false, message: '日期不正确，应为01~31' };
  }
  // 检查该月最大天数
  const date = new Date(year, month - 1, day);
  if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
    return { isValid: false, message: '日期不正确，该月没有这一天' };
  }
  return { isValid: true };
}

// 数值型校验（根据计量单位）
export function validateNumber(value: string, unit?: string): ValidationResult {
  // 检查是否为有效数字
  const numberRegex = /^-?\d*\.?\d+$/;
  if (!numberRegex.test(value)) {
    return { isValid: false, message: '格式错误：只能输入数字，可包含负号和小数点' };
  }

  const number = parseFloat(value);

  // 根据单位进行特定校验
  if (unit) {
    switch (unit) {
      case 'kW':
      case 'MW':
        if (number < 0) {
          return { isValid: false, message: '功率不能为负数' };
        }
        break;
      case 'A':
        if (number < 0) {
          return { isValid: false, message: '电流不能为负数' };
        }
        break;
      case 'V':
        if (number < 0) {
          return { isValid: false, message: '电压不能为负数' };
        }
        break;
      case 'Hz':
        if (number <= 0) {
          return { isValid: false, message: '频率必须大于0' };
        }
        break;
      case 'r/min':
        if (number <= 0) {
          return { isValid: false, message: '转速必须大于0' };
        }
        break;
      case '℃':
        // 温度可以为负数，不做特殊限制
        break;
      case 'MPa':
      case 'kPa':
        // 压力可以为负数（真空），不做特殊限制
        break;
      case 'm³/h':
        if (number < 0) {
          return { isValid: false, message: '流量不能为负数' };
        }
        break;
      case 'm':
      case 'mm':
        // 长度可以为负数（相对位置），不做特殊限制
        break;
      case 'kg':
      case 't':
        if (number < 0) {
          return { isValid: false, message: '质量不能为负数' };
        }
        break;
      case '%':
        if (number < 0 || number > 100) {
          return { isValid: false, message: '百分比必须在0-100之间' };
        }
        break;
      default:
        // 其他单位不做特殊限制
        break;
    }
  }

  return { isValid: true };
}

// 坐标校验（根据示例或属性说明）
export function validateCoordinate(value: string, example: string): ValidationResult {
  // 检查是否为空
  if (!value || value.trim() === '') {
    return { isValid: false, message: '坐标不能为空' };
  }

  // 如果示例中包含"坐标系名称"，检查格式是否为"坐标系名称（X坐标，Y坐标，Z坐标）"
  if (example.includes('坐标系名称')) {
    // 支持中文括号和逗号：（，）以及英文括号和逗号：(,)
    const coordRegex = /^.+[（(]-?\d+\.?\d*[，,]-?\d+\.?\d*[，,]-?\d+\.?\d*[）)]$/;
    if (!coordRegex.test(value)) {
      return { isValid: false, message: '坐标格式不正确，应为：坐标系名称（X坐标，Y坐标，Z坐标）' };
    }
    return { isValid: true };
  }
  
  // 根据示例格式判断坐标类型
  if (example.includes('经度') || example.includes('纬度')) {
    // 经纬度格式：xx.xxxxx, yy.yyyyy
    const coordRegex = /^-?\d+\.\d+,\s*-?\d+\.\d+$/;
    if (!coordRegex.test(value)) {
      return { isValid: false, message: '经纬度格式不正确，应为：xx.xxxxx, yy.yyyyy' };
    }

    const [lon, lat] = value.split(',').map(v => parseFloat(v.trim()));
    if (lon < -180 || lon > 180) {
      return { isValid: false, message: '经度必须在-180到180度之间' };
    }
    if (lat < -90 || lat > 90) {
      return { isValid: false, message: '纬度必须在-90到90度之间' };
    }
  } else if (example.includes('X') || example.includes('Y') || example.includes('Z')) {
    // X/Y/Z坐标格式：x, y, z
    const coordRegex = /^-?\d+\.?\d*,\s*-?\d+\.?\d*(?:,\s*-?\d+\.?\d*)?$/;
    if (!coordRegex.test(value)) {
      return { isValid: false, message: '坐标格式不正确，应为：x, y 或 x, y, z' };
    }
  } else {
    // 其他坐标格式，只检查是否为数字和逗号组合
    const coordRegex = /^-?\d+\.?\d*(?:,\s*-?\d+\.?\d*)*$/;
    if (!coordRegex.test(value)) {
      return { isValid: false, message: '坐标格式不正确，应为用逗号分隔的数字' };
    }
  }

  return { isValid: true };
}

// 生成智能占位符
export function generatePlaceholder(dataType: string, example: string, unit?: string): string {
  switch (dataType.toLowerCase()) {
    case '字符型':
      return example || '请输入文本';
    case '日期型':
      return 'YYYY-MM-DD';
    case '数值型':
      return `请输入数值${unit ? ` (${unit})` : ''}`;
    default:
      return example || '';
  }
}

// 参数值校验
export function validateParameterValue(
  value: string,
  dataType: string,
  unit?: string,
  example?: string,
  isPositionTable: boolean = false
): ValidationResult {
  if (!value || value.trim() === '') {
    return { isValid: true }; // 空值默认通过，由业务逻辑决定是否必填
  }

  // 检查是否为坐标类型（根据示例描述判断）
  if (example && (example.includes('坐标') || example.includes('X') || example.includes('Y') || example.includes('Z'))) {
    return validateCoordinate(value, example);
  }

  switch (dataType.toLowerCase()) {
    case '字符型':
      return validateString(value);
    case '日期型':
      return validateDate(value);
    case '数值型':
      return validateNumber(value, unit);
    default:
      return { isValid: true };
  }
} 